package Utils.io;

import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import java.io.IOException;
import java.io.InputStream;

/**
 * XML工具类
 *
 * @author d11yu
 */
public class XMLUtils {
    /**
     * 将Xml文件解析成目标类，仅适合使用一次的情况。
     *
     * @param path      Xml文件的路径
     * @param typeClass 目标类的class
     * @return 返回目标类
     * @throws IOException IOException
     */
    public static <T> T parseXml(String path, Class<T> typeClass) throws IOException {
        JacksonXmlModule module = new JacksonXmlModule();
        XmlMapper mapper = new XmlMapper(module);
        return parseXml(path, mapper, typeClass);
    }

    /**
     * 将Xml文件解析成目标类，适合多次使用。
     *
     * @param path      Xml文件的路径
     * @param mapper    XmlMapper对象
     * @param typeClass 目标类的class
     * @return 返回目标类
     * @throws IOException IOException
     */
    public static <T> T parseXml(String path, XmlMapper mapper, Class<T> typeClass) throws IOException {
        try (InputStream is = IOUtils.file2InputStream(path)) {
            return parseXml(is, mapper, typeClass);
        }
    }

    /**
     * 将Xml文件解析成目标类，适合多次使用。
     *
     * @param mapper      XmlMapper对象
     * @param inputStream 输入流
     * @param typeClass   目标类的class
     * @param <T>         目标类的泛型
     * @return 返回目标类
     * @throws IOException IOException
     */
    public static <T> T parseXml(InputStream inputStream, XmlMapper mapper, Class<T> typeClass) throws IOException {
        return mapper.readValue(inputStream, typeClass);
    }
}
